#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：接口.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/2/28 21:53 
"""

from abc import ABCMeta, abstractmethod


# ABCMeta元类和abstractmethod修饰符
# ABC为abstract class的简称

# 开放封闭原则：一个软件系统，如果想要增加新功能，那么应该尽量不要修改原来的代码，而是应该增加新的代码。

# 里氏替换原则：任何基类可以出现的地方，子类一定可以出现。所有子类对象都可以替换掉父类对象。

# 依赖注入原则：依赖抽象，不要依赖具体类。
# 高层模块不应该依赖于底层模块，二者都应该依赖于抽象，也就是依赖于接口。
# 抽象不应该依赖于细节，细节应该依赖于抽象。
# 重点：应该针对接口编程，而不是针对实现编程。

# 接口隔离原则：一个接口应该只实现一个功能。使用多个隔离的接口，比使用单个接口要好。

# 单一职责原则：一个类只负责一个功能领域，这个原则可以用来限制一个类只能干一件事。


# 定义一个抽象类
class Payment(metaclass=ABCMeta):
    @abstractmethod
    def pay(self, money):
        pass


# 定义两个子类
class Alipay(Payment):
    def pay(self, money):
        print("支付宝支付", money)


class Wechatpay(Payment):
    def pay(self, money):
        print("微信支付", money)


p = Alipay()

p.pay(100)


# 里氏替换原则演示
class User:
    def show_name(self):
        print("我是普通用户")
        pass


class VIPUser(User):
    def show_name(self):
        print("我是VIP用户")


def show_user_name(user):
    user.show_name()


vip = VIPUser()
regular_user = User()

show_user_name(vip)
show_user_name(regular_user)
